﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FinanSoft.Utilities;
using FinanSoft.Entities;
using System.Data.SqlClient;
using System.Security.Cryptography;

namespace FinanSoft.DataLayer
{
    public class UserDataManager
    {
        #region Singleton
        private UserDataManager()
        {
        }

        /// <summary>
        /// Única instancia de esta clase
        /// </summary>
        private static UserDataManager _instance;

        /// <summary>
        /// Método para implementar el patrón de Singleton
        /// </summary>
        /// <returns>Instancia única de la clase</returns>
        public static UserDataManager GetInstance()
        {
            if (_instance == null)
                _instance = new UserDataManager();
            return _instance;
        }
        #endregion

        #region Metodos publicos de la clase
        /// <summary>
        /// Método que se encarga de autenticar el logueo de un usuario al sistema
        /// </summary>
        /// <param name="username">Nombre usuario</param>
        /// <param name="password">Contraseña</param>
        /// <returns>Retorna un código de validación por si hubo éxito o no</returns>
        public User LoginUser(String username, String password)
        {
            User loggedUser = new User();
            try
            {
                AppConfigReader appConfig = AppConfigReader.GetInstance();
                string spName = Constants.SP_NAME_LOGIN_USER;

                SqlParameter[] parameters = new SqlParameter[2];
                parameters[0] = new SqlParameter(Constants.SP_PARAM_LOGIN_USERNAME, username);
                parameters[1] = new SqlParameter(Constants.SP_PARAM_LOGIN_PASSWORD, password);
                SqlDataHelper dataHelper = new SqlDataHelper(appConfig.GetConnectionString(Constants.DB_CONN));
                SqlDataReader result = dataHelper.ExecuteStoredProcedure(spName, parameters);
                if (result.HasRows)
                {
                    result.Read();
                    loggedUser.Id = (int) result[Constants.SP_COLUMN_LOGIN_USER_ID];
                    loggedUser.Nombre = (String) result[Constants.SP_COLUMN_LOGIN_NAME];
                    loggedUser.NombreUsuario  = (String)result[Constants.SP_COLUMN_LOGIN_USERNAME];
                    loggedUser.Autentication = Constants.ValidationCode.LoginSucceeded;
                }
                else
                    loggedUser.Autentication = Constants.ValidationCode.LoginFailed;
            }
            catch (Exception ex)
            {
                loggedUser.Autentication = Constants.ValidationCode.ConnectionFailed;
            }
            return loggedUser;
        }

        /// <summary>
        /// Métodod que se encarga de llamar a la base de datos por el id de la cuenta auxiliar para un usuario cliente
        /// en específico
        /// </summary>
        /// <param name="userId">Id del usuario cliente</param>
        /// <returns>Id de la cuenta auxiliar asociada a dicho cliente</returns>
        public int GetUserClienAuxtAccountId(int userId)
        {
            int auxAccountId = Constants.INVALID_ID;
            try
            {
                AppConfigReader appConfig = AppConfigReader.GetInstance();
                string spName = Constants.SP_NAME_GET_AUXID_FOR_CLIENT;

                SqlParameter[] parameters = { new SqlParameter(Constants.SP_PARAM_USER_CLIENT_ID, userId) };

                SqlDataHelper dataHelper = new SqlDataHelper(appConfig.GetConnectionString(Constants.DB_CONN));
                SqlDataReader result = dataHelper.ExecuteStoredProcedure(spName, parameters);
                while (result.Read())
                {
                    auxAccountId = Convert.ToInt32(result[Constants.SP_COLUMN_USER_CLIENT_AUXID]);
                }
                dataHelper.CloseReader();
                return auxAccountId;
            }
            catch (Exception ex)
            {
                auxAccountId = Constants.INVALID_ID;
            }

            return auxAccountId; 
        }
        #endregion
    }
        
}
